linux进程与线程
linux进程、线程与cpu的亲和性(affinity)

linux进程、线程与cpu的亲和性(affinity)最近的⼯作中对性能的要求⽐较⾼,下⾯简单做⼀下总结:⼀、什么是cpu亲和性(affinity) CPU的亲和性,就是进程要在指定的 CPU 上尽量长时间地运⾏⽽不被迁移到其他处理器,也称为CPU关联性;再简单的点的描述就将制定的进程或线程绑定到相应的cpu上;在多核运⾏的机器上,每个CPU本⾝⾃⼰会有缓存,缓存着进程使⽤的信息,⽽进程可能会被OS调度到其他CPU上,如此,CPU cache命中率就低了,当绑定CPU后,程序就会⼀直在指定的cpu跑,不会由操作系统调度到其他CPU上,性能有⼀定的提⾼。
软亲和性(affinity): 就是进程要在指定的 CPU 上尽量长时间地运⾏⽽不被迁移到其他处理器,Linux 内核进程调度器天⽣就具有被称为软 CPU 亲和性(affinity)的特性,这意味着进程通常不会在处理器之间频繁迁移。
这种状态正是我们希望的,因为进程迁移的频率⼩就意味着产⽣的负载⼩。
硬亲和性(affinity):简单来说就是利⽤linux内核提供给⽤户的API,强⾏将进程或者线程绑定到某⼀个指定的cpu核运⾏。
解释:在linux内核中,所有的进程都有⼀个相关的数据结构,称为 task_struct。
这个结构⾮常重要,原因有很多;其中与亲和性(affinity)相关度最⾼的是 cpus_allowed 位掩码。
这个位掩码由 n 位组成,与系统中的 n 个逻辑处理器⼀⼀对应。
具有 4 个物理 CPU 的系统可以有 4 位。
如果这些CPU 都启⽤了超线程,那么这个系统就有⼀个 8 位的位掩码。
如果为给定的进程设置了给定的位,那么这个进程就可以在相关的 CPU 上运⾏。
因此,如果⼀个进程可以在任何 CPU 上运⾏,并且能够根据需要在处理器之间进⾏迁移,那么位掩码就全是 1。
实际上,这就是 Linux 中进程的缺省状态;(这部分内容在这个博客中有提到⼀点:) cpus_allowed⽤于控制进程可以在哪⾥处理器上运⾏sched_set_affinity()(⽤来修改位掩码)sched_get_affinity()(⽤来查看当前的位掩码)⼆、进程与cpu的绑定 sched_setaffinity可以将某个进程绑定到⼀个特定的CPU。
关于linux的进程中的各个线程cpu占用情况的分析和查看

关于linux的进程中的各个线程cpu占⽤情况的分析和查看我们常常会在新开的服搭建⼀个游戏的server,有时候要进⾏压⼒測试,那么怎样来看呢,⼀般我们会通过top命令查看各个进程的cpu和内存占⽤情况,获得到了我们的进程id,然后我们或许会通过pstack命令查看⾥边的各个线程id以及相应的线程如今正在做什么事情,分析多组数据就能够获得哪些线程⾥有慢操作影响了server的性能,从⽽得到解决⽅式。
⽐⽅这种以组数据:[root@AY130816144542124256Z bin]# pstack 30222Thread 9 (Thread 0x7f729adc1700 (LWP 30251)):#0 0x00007f72a429b720 in sem_wait () from /lib64/libpthread.so.0#1 0x0000000000ac5eb6 in Semaphore::down() ()#2 0x0000000000ac5cac in Queue::get() ()#3 0x00000000009a583f in DBManager::processUpdate(Queue*) ()#4 0x00000000009a4bfb in dbUpdateThread(void*) ()#5 0x00007f72a4295851 in start_thread () from /lib64/libpthread.so.0#6 0x00007f72a459267d in clone () from /lib64/libc.so.6Thread 8 (Thread 0x7f727c579700 (LWP 30252)):#0 0x00007f72a429b720 in sem_wait () from /lib64/libpthread.so.0#1 0x0000000000ac5eb6 in Semaphore::down() ()#2 0x0000000000ac5cac in Queue::get() ()#3 0x00000000009a5799 in DBManager::processQuery(Queue*) ()#4 0x00000000009a4c3a in dbQueryThread(void*) ()#5 0x00007f72a4295851 in start_thread () from /lib64/libpthread.so.0#6 0x00007f72a459267d in clone () from /lib64/libc.so.6Thread 7 (Thread 0x7f7257fff700 (LWP 30253)):#0 0x00007f72a42997bb in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0#1 0x00007f72a549ee08 in utils::thread::condition_impl::timed_wait(int) () from /usr/local/utils-0.0.1/lib/libutils.so.0.0.1#2 0x00007f72a549ebd3 in utils::thread::Condition::timed_wait(int) () from /usr/local/utils-0.0.1/lib/libutils.so.0.0.1#3 0x00000000009d5f57 in utils::MessageQueue<FightInfo*>::pop() ()#4 0x00000000009d5557 in FightReport::svc() ()#5 0x00007f72a5494b45 in utils::Task_Base::thread_proc(void*) () from /usr/local/utils-0.0.1/lib/libutils.so.0.0.1#6 0x00007f72a4295851 in start_thread () from /lib64/libpthread.so.0#7 0x00007f72a459267d in clone () from /lib64/libc.so.6Thread 6 (Thread 0x7f72397b7700 (LWP 30254)):#0 0x00007f72a4588fc3 in poll () from /lib64/libc.so.6#1 0x00007f72a0fbded4 in __libc_res_nsend () from /lib64/libresolv.so.2#2 0x00007f72a0fba76a in __libc_res_nquery () from /lib64/libresolv.so.2#3 0x00007f72a0fbad29 in __libc_res_nquerydomain () from /lib64/libresolv.so.2#4 0x00007f72a0fbb9cf in __libc_res_nsearch () from /lib64/libresolv.so.2#5 0x00007f729adc37a7 in _nss_dns_gethostbyname4_r () from /lib64/libnss_dns.so.2#6 0x00007f72a457a4c3 in gaih_inet () from /lib64/libc.so.6#7 0x00007f72a457cb20 in getaddrinfo () from /lib64/libc.so.6#8 0x00007f72a56fc782 in Curl_getaddrinfo_ex () from /usr/lib64/libcurl.so.4#9 0x00007f72a56f1d42 in Curl_getaddrinfo () from /usr/lib64/libcurl.so.4#10 0x00007f72a56c9e77 in Curl_resolv () from /usr/lib64/libcurl.so.4#11 0x00007f72a56ca138 in Curl_resolv_timeout () from /usr/lib64/libcurl.so.4#12 0x00007f72a56d8d88 in ?() from /usr/lib64/libcurl.so.4#13 0x00007f72a56ddb79 in ?() from /usr/lib64/libcurl.so.4#14 0x00007f72a56de76e in Curl_connect () from /usr/lib64/libcurl.so.4#15 0x00007f72a56e69b0 in Curl_perform () from /usr/lib64/libcurl.so.4#16 0x0000000000ae6e3d in HttpClient::svc() ()#17 0x00007f72a5494b45 in utils::Task_Base::thread_proc(void*) () from /usr/local/utils-0.0.1/lib/libutils.so.0.0.1#18 0x00007f72a4295851 in start_thread () from /lib64/libpthread.so.0#19 0x00007f72a459267d in clone () from /lib64/libc.so.6Thread 5 (Thread 0x7f721af6f700 (LWP 30255)):#0 0x00007f72a455691d in nanosleep () from /lib64/libc.so.6#1 0x000000000098cb8a in Sleep(unsigned long) ()#2 0x000000000098b87d in DynResource::svc() ()#3 0x00007f72a5494b45 in utils::Task_Base::thread_proc(void*) () from /usr/local/utils-0.0.1/lib/libutils.so.0.0.1#4 0x00007f72a4295851 in start_thread () from /lib64/libpthread.so.0#5 0x00007f72a459267d in clone () from /lib64/libc.so.6Thread 4 (Thread 0x7f71fc727700 (LWP 30256)):#0 0x00007f72a455691d in nanosleep () from /lib64/libc.so.6#1 0x000000000098cb8a in Sleep(unsigned long) ()#2 0x0000000000a61516 in PlayerOpLogThread::svc() ()#3 0x00007f72a5494b45 in utils::Task_Base::thread_proc(void*) () from /usr/local/utils-0.0.1/lib/libutils.so.0.0.1#4 0x00007f72a4295851 in start_thread () from /lib64/libpthread.so.0#5 0x00007f72a459267d in clone () from /lib64/libc.so.6Thread 3 (Thread 0x7f71ddedf700 (LWP 30257)):#0 0x00007f72a4592c73 in epoll_wait () from /lib64/libc.so.6#1 0x00007f72a51f334f in Epoll_Reactor::run_reactor_event_loop() () from /usr/local/net_manager-0.0.2/lib/libnet_manager.so.0.0.2#2 0x00007f72a51f2523 in Net_Thread::svc() () from /usr/local/net_manager-0.0.2/lib/libnet_manager.so.0.0.2#3 0x00007f72a5494b45 in utils::Task_Base::thread_proc(void*) () from /usr/local/utils-0.0.1/lib/libutils.so.0.0.1#4 0x00007f72a4295851 in start_thread () from /lib64/libpthread.so.0#5 0x00007f72a459267d in clone () from /lib64/libc.so.6Thread 2 (Thread 0x7f71bf697700 (LWP 30258)):#0 0x00007f72a4592c73 in epoll_wait () from /lib64/libc.so.6#1 0x00007f72a51f334f in Epoll_Reactor::run_reactor_event_loop() () from /usr/local/net_manager-0.0.2/lib/libnet_manager.so.0.0.2#2 0x00007f72a51f2523 in Net_Thread::svc() () from /usr/local/net_manager-0.0.2/lib/libnet_manager.so.0.0.2#3 0x00007f72a5494b45 in utils::Task_Base::thread_proc(void*) () from /usr/local/utils-0.0.1/lib/libutils.so.0.0.1#4 0x00007f72a4295851 in start_thread () from /lib64/libpthread.so.0#5 0x00007f72a459267d in clone () from /lib64/libc.so.6Thread 1 (Thread 0x7f72a60ae7e0 (LWP 30222)):#0 0x00007f72a4584c95 in _xstat () from /lib64/libc.so.6#1 0x00007f72a45483e0 in __tzfile_read () from /lib64/libc.so.6#2 0x00007f72a4547864 in tzset_internal () from /lib64/libc.so.6#3 0x00007f72a4547b20 in tzset () from /lib64/libc.so.6#4 0x00007f72a4546699 in timelocal () from /lib64/libc.so.6#5 0x0000000000b0b08d in Achieve::GetRemainTime(AchieveTemplate*) ()#6 0x0000000000b115ca in Achieve::update() ()#7 0x0000000000a197ce in Player::update() ()#8 0x0000000000b1b272 in PlayerMng::Tick() ()#9 0x0000000000a73105 in GameServer::FrameTick(unsigned int) ()#10 0x0000000000a6ff80 in GameServer::run() ()#11 0x0000000000a773a1 in main ()[root@AY130816144542124256Z gameserver]# ps -eLo pid,lwp,pcpu | grep 3022230222 30222 31.430222 30251 0.030222 30252 0.030222 30253 0.030222 30254 0.030222 30255 0.030222 30256 1.230222 30257 1.230222 30258 1.0多组数据显⽰表明我们的主逻辑线程的确占⽤的cpu⾮常⾼,发现事实上在Achieve::update() 的时候做了太多没实⽤的推断,⽽且能够降低循环进⼊的次数的。
Linux基础(习题卷31)

Linux基础(习题卷31)第1部分:单项选择题,共60题,每题只有一个正确答案,多选或少选均不得分。
1.[单选题]下面关于进程、线程的说法正确的是()?A)进程是程序的一次动态执行过程。
一个进程在其执行过程中只能产生一个线程。
B)线程是比进程更小的执行单位是在一个进程中独立的控制流即程序内部的控制流。
线程本身能够自动运行。
C)Java多线程的运行与平台无关。
D)对于单处理器系统多个线程分时间片获取CPU或其他系统资源来运行。
对于多处理器系统线程可以分配到多个处理器中从而真正的并发执行多任务。
答案:D解析:2.[单选题]下面哪个系统目录中存放了系统引导、启动时使用的一些文件和目录( )。
A)/rootB)/binC)/devD)/boot答案:D解析:3.[单选题]以下命令中,_______的作用是显示一个文件最后几行。
A)tarB)tailC)rearD)last答案:B解析:4.[单选题]在目录/user/local/jdk1.6有一可执行文件java,想在tomcat用户下任意目录下都可以像ls命令一样可以执行而不用输入全路径,下列哪个说法是正确的(单 选)A)在shell执行一次exportB)把exportC)在shell执行一次exportD)以上说法都不正确答案:B解析:5.[单选题]( )。
要将软件包vlc-2.0.4-5.el6.i686.rpm从Linux系统中删除,应该执行命令()。
A)rpmB)rpmC)rpmD)rpm答案:AA)只能进行进程互斥B)只能进行进程同步C)能够进行进程的同步和互斥D)互斥和同步都不可以答案:C解析:7.[单选题]在下列磁盘调度算法中,哪个考虑 I/O 请求到达的先后次序。
( )A)先来先服务算法B)响应者最高比算法C)优先级调度算法D)负载均衡算法答案:A解析:8.[单选题]在分时系统中,时间片一定,(),响应时间越长。
A)内存越多B)用户数越多C)后备队列D)用户数越少答案:B解析:9.[单选题]设与某资源 R 关联的信号量初始值为 5,当前值为-2,下列说法错误的是( )。
3-UNIX&Linux操作系统编程-进程与线程

files_struct count close_on_exec open_fs fd[0] fd[1] ……
inode f_mode f_pcs f_flags f_count f_owner f_inode f_op f_version file
fd[255]
file operation routines
exit 函数会执行一些特定的清理操作,还会执行标准I/O库的清理 关闭操作(为所有打开流调用fclose函数,这会使得所有缓冲的 输出数据被更新到相应的设备),然后返回内核
exit与return的区别
C语言关键字return与函数exit()在main函数退出 时有相似之处,但两者有本质的区别:
/usr/include/linux/sched.h #define TASK_RUNNING #define TASK_INTERRUPTIBLE #define TASK_UNINTERRUPTIBLE #define TASK_ZOMBIE #define TASK_STOPPED
0 1 2 4 8
2
用户级进程状态切换
收到信号,执行wake_up( ) TASK_RUNNING 就绪状态 唤醒 wake_up( ) 唤醒 wake_up_interruptible()
调度 schedule( )
TASK_UNINTERRUPTIBLE 等待状态(不可中断) schedule( ) sleep_on( )
TASK_INTERRUPTIBLE 等待状态(可中断) schedule( ) interruptible_sleep_on( )
CPU处理运行 syscall_trace( ) schedule( ) sys_exit( ) do_exit( ) TASK_ZOMBIE 僵死状态
Linux下查看进程和线程

在Linux中查看线程数的三种方法1、top -H手册中说:-H : Threads toggle加上这个选项启动top,top一行显示一个线程。
否则,它一行显示一个进程。
2、ps xH手册中说:H Show threads as if they were processes这样可以查看所有存在的线程。
3、ps -mp <PID>手册中说:m Show threads after processes这样可以查看一个进程起的线程数。
查看进程1. top 命令top命令查看系统的资源状况load average表示在过去的一段时间内有多少个进程企图独占CPUzombie 进程:不是异常情况。
一个进程从创建到结束在最后那一段时间遍是僵尸。
留在内存中等待父进程取的东西便是僵尸。
任何程序都有僵尸状态,它占用一点内存资源,仅仅是表象而已不必害怕。
如果程序有问题有机会遇见,解决大批量僵尸简单有效的办法是重起。
kill是无任何效果的stop模式:与sleep进程应区别,sleep会主动放弃cpu,而stop 是被动放弃cpu ,例单步跟踪,stop(暂停)的进程是无法自己回到运行状态的。
cpu states:nice:让出百分比irq:中断处理占用idle:空间占用百分比iowait:输入输出等待(如果它很大说明外存有瓶颈,需要升级硬盘(SCSI))Mem:内存情况设计思想:把资源省下来不用便是浪费,如添加内存后free值会不变,buff值会增大。
判断物理内存够不够,看交换分区的使用状态。
交互命令:[Space]立即刷新显示[h]显示帮助屏幕[k] 杀死某进程。
你会被提示输入进程ID 以及要发送给它的信号。
一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。
默认值是信号15。
在安全模式中此命令被屏蔽。
[n] 改变显示的进程数量。
你会被提示输入数量。
[u] 按用户排序。
[M] 按内存用量排序。
Linux系统如何查看进程的线程数

Linux系统如何查看进程的线程数Linux系统如何查看进程的线程数Linux系统的进程是由线程组成的,当然Linux进程下的线程数是不固定的,可以是一个进程,也可以是多个进程。
本文就来教大家Linux系统如何查看进程的线程数?一、使用命令查看Linux进程的线程数1、使用top命令,具体用法是 top -H加上这个选项,top的每一行就不是显示一个进程,而是一个线程。
2、使用ps命令,具体用法是 ps -xH这样可以查看所有存在的线程,也可以使用grep作进一步的过滤。
3、使用ps命令,具体用法是 ps -mq PID这样可以看到指定的进程产生的线程数目。
二、Linux系统工具查看Linux进程看看这个目录吧,/proc/5000/ 这里面有你所有想要的。
其实stat代表着当前的一些信息。
使用ps命令来查看进程的时候,进程状态分别对应的含义如下:D 不可中断睡眠(通常是在IO操作)收到信号不唤醒和不可运行,进程必须等待直到有中断发生R 正在运行或可运行(在运行队列排队中)S 可中断睡眠(休眠中,受阻,在等待某个条件的形成或接受到信号)T 已停止的` 进程收到SIGSTOP,SIGSTP,SIGTIN,SIGTOU 信号后停止运行W 正在换页(2.6.内核之前有效)X 死进程(未开启)Z 僵尸进程进程已终止,但进程描述符存在,直到父进程调用wait4()系统调用后释放BSD风格的《高优先级(not nice to other users)N 低优先级(nice to other users)L 页面锁定在内存(实时和定制的IO)s 一个信息头l 多线程(使用 CLONE_THREAD,像NPTL的pthreads的那样)+ 在前台进程组以上就是Linux查看进程的线程数的方法了,Linux进程的线程数是进程的一个重要参数,也是管理Linux进程应该要知道的信息。
【Linux系统如何查看进程的线程数】。
linux系统中调度的基本单位

linux系统中调度的基本单位一、进程调度进程调度是操作系统中的一个重要组成部分,用于决定在多个进程同时竞争CPU资源时,应该选择哪个进程来执行。
Linux系统中的进程调度采用了时间片轮转调度算法。
时间片轮转调度是一种公平的调度算法,它将CPU的执行时间划分为一个个固定长度的时间片,每个进程在一个时间片内执行一段时间,然后切换到下一个进程。
这样可以保证每个进程都有机会执行,并且避免了长时间占用CPU 的情况。
二、线程调度线程调度是指在多线程应用程序中,操作系统决定哪个线程应该被执行的过程。
Linux系统中的线程调度和进程调度类似,同样采用时间片轮转调度算法。
不同的是,线程是共享同一个进程的资源,因此线程的切换相对于进程的切换来说更加轻量级。
线程调度的目标是尽可能地提高CPU利用率和系统响应速度。
三、任务调度任务调度是指在Linux系统中,操作系统决定何时执行某个任务的过程。
任务可以是周期性的,也可以是非周期性的。
周期性任务是指按照一定的时间间隔重复执行的任务,而非周期性任务则是指只执行一次的任务。
Linux系统中的任务调度使用了多种算法,如最早截止时间优先算法和最短作业优先算法等。
这些算法的目标是根据任务的优先级和执行时间来决定任务的执行顺序,以提高系统的性能和响应速度。
四、总结在Linux系统中,进程调度、线程调度和任务调度是操作系统中的重要组成部分。
进程调度决定在多个进程竞争CPU资源时的执行顺序,线程调度决定在多线程应用程序中哪个线程应该被执行,任务调度决定何时执行某个任务。
这些调度的基本单位都采用了时间片轮转调度算法,并根据不同的调度目标采用不同的调度策略。
通过合理的调度算法,可以提高系统的性能和响应速度,保证各个任务的执行顺序和时间片的分配合理。
linux 上下文切换指标

linux 上下文切换指标
Linux 上下文切换指标是衡量操作系统性能的重要指标之一。
上下文切换是指操作系统在执行多任务时,将当前任务的上下文保存起来,然后切换到另一个任务执行的过程。
上下文切换的频率越高,说明操作系统需要更多的时间来切换任务,从而影响系统的性能。
在Linux 系统中,上下文切换指标包括进程上下文切换和线程上下文切换。
进程上下文切换是指在不同进程之间切换时发生的上下文切换,而线程上下文切换是指在同一进程内的不同线程之间切换时发生的上下文切换。
进程上下文切换的频率受到多种因素的影响,包括 CPU 的数量、进程的数量、进程的调度算法等。
在Linux 系统中,进程的调度算法主要有三种:时间片轮转调度、优先级调度和实时调度。
不同的调度算法会对进程上下文切换的频率产生不同的影响。
线程上下文切换的频率受到线程的数量、线程的调度算法等因素的影响。
在Linux 系统中,线程的调度算法主要有两种:抢占式调度和协同式调度。
抢占式调度是指操作系统可以在任何时候强制切换线程,而协同式调度是指线程必须自愿放弃CPU 才能切换到其他线程。
为了减少上下文切换的频率,可以采取一些优化措施。
例如,可以通过调整进程的优先级、减少进程的数量、使用更高效的调度算法
等方式来降低上下文切换的频率。
此外,还可以采用多线程编程的方式来减少线程上下文切换的频率。
Linux 上下文切换指标是衡量操作系统性能的重要指标之一。
了解上下文切换的原理和影响因素,可以帮助我们更好地优化系统性能,提高系统的稳定性和可靠性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
►进程的概念
►进程的特性
►进程的状态及其转换
►进程的控制
►Linux中的进程控制 ►线程
linux操作系统 华软软件学院电子系
P1
教学要求
►掌握程序、进程、线程的区别 ►掌握进程的基本状态及状态转换 ►了解进程控制块(PCB)的内容 ►重点掌握linux系统中进程相关的命令、系统 调用、库函数
因等待某种事件 或者资源而无法运 行,即使CPU空闲, 该进程也不可运行 等待某 事件或 资源。
具备运行 条件,但 暂无CPU
就绪
阻塞
进程的状态及其转换
linux操作系统 华软软件学院电子系
P11
Unix进程状 态及其变迁
内存就绪
运行
exit
等待
低优睡眠 高优睡眠
换出
换出
换出
就绪
换入
唤醒
等待
外存就绪
linux操作系统
华软软件学院电子系
P16
Linux系统中的PCB
►Linux PCB(task_struct)
n 包含进程所有信息 n task_struct数据结构很庞大,但并不复杂,按功能将所 有域划分:
u u u u u u u u
u
u u u
1、进程状态(State) 2、进程调度信息(Scheduling Information) 3、各种标识符(Identifiers) 4、进程通信有关信息(IPC:Inter_Process Communication) 5、时间和定时器信息(Times and Timers) 6、进程链接信息(Links) 7、文件系统信息(File System) 8、虚拟内存信息(Virtual Memory) 9、页面管理信息(page) 10、对称多处理器(SMP)信息 11、和处理器相关的环境(上下文)信息(Processor Specific Context) 12、其它信息 华软软件学院电子系
P26
进程的创建
► Linux中的进程创建
n init_task:
u
u
Linux在启动时运行在核心态,这时只有初始化程序 在执行是系统的第一个进程,因此称为初始进程。 init_task在系统初始化结束后,初始进程启动一个 核心进程,称为init。然后执行空闲循环,什么也不 做。当系统没有其他工作时,调度程序会运行这个空 闲进程。
linux操作系统
华软软件学院电子系
P2
单道与多道程序设计
►多道程序设计的提出
n 单道程序设计
u
u
执行特点:静态的、孤立的 具体特性:顺序性、封闭性、可再现性、资源独占性
为了充分有效地利用计算机 的有限资源,提出了多道程序设计
linux操作系统 华软软件学院电子系
P3
n 并发执行及“与时间有关的错误” u 并发执行,是指多个程序段之间在执行时间上重叠。 u 多程序段同时在系统中运行 u 宏观上并行,微观上串行 u 资源共享 u 问题: l 资源冲突,甚至死锁 l “与时间有关的错误”
n 僵死状态
进程执行了exit()函数后进入该状态,即进程被终止 u 此状态将由父进程执行wait()系统调用而“唤醒”, 真正终止该进程,并回收其资源 u 处于该状态的进程是死进程,属于系统中的垃圾,必 须进行相应处理以释放其占用的资源
u
n 死亡状态:僵死进程被父进程回收后的状态
linux操作系统 华软软件学院电子系
linux操作系统 华软软件学院电子系
P21
Linux中与进程相关的命令
PS
-A:列出所有的行程
-w:显示加宽可以显示较多的资讯
-au:显示较详细的资讯 -aux:显示所有包含其他使用者的行程
-e:显示所有进程,环境变量
-f:全格式 -h:不显示标题
-l:长格式
注意区分“ps aux”和“ps -aux”命令
P23
Linux中与进程相关的命令
TOP
句法:top [OPTIONS] 功能:实时显示系统中各个进程的资源占用状况 TOP命令是一个动态显示过程,可以通过用户按键来不断 刷新当前状态。
TOP命令是Linux下常用的性能分析工具
linux操作系统
华软软件学院电子系
P24
操作系统内核
► CPU的两种执行状态:系统态和用户态 n 系统态/核心态(特态或管态):该状态下,CPU能执行 指令集中任何指令; n 用户态(常态或目态):该状态下,CPU只能执行一般的 指令,不能执行特权指令。 ► 操作系统内核功能 n 中断处理 n 时钟管理 n 原语操作 n 进程管理 n 存储器管理 n 设备管理
►进程映像:
n 程序和数据是进程的静态部分,可见 n PCB是进程的动态部分,不可见 linux操作系统 华软软件学院电子系
P13
进程控制块PCB
►进程控制块(PCB)
n PCB---Process Control Block n 记彔了OS控制和管理进程的所需的所有信息, 是进程属性的动态描述(PCB在Linux中对应 task_struct,也称为PD;PCB在Unix中对应 于proc和user结构)
单道与多道程序设计
单道程序设计
多道程序设计
linux操作系统
华软软件学院电子系
P4
进程的定义
►进程的定义:进程是可并发执行的程序在一个数据 集合的运行过程。它是操作系统动态执行的基本单 元,是系统进行资源分配的独立单位。
启动浏览器IE后, 得到的进程
linux操作系统
华软软件学院电子系
P5
进程与程序及其分类
►进程控制块与进程关系:
n 每个进程有唯一的PCB。 n 操作系统(OS)根据PCB管理进程。 n 利用PCB实现进程的动态、并发。 n PCB是进程存在的唯一标志。
linux操作系统 华软软件学院电子系
P14
进程控制块PCB
►PCB的内容
n 标识信息:进程标识、用户名 n 说明信息:进程状态、等待原因、进程程序和数 据的存储信息 n 现场信息:记彔重要寄存器、时钟等内容,用于 恢复断点 n 管理调度信息:进程优先级、进程队列指针、消 息队列指针、进程使用的资源清单、进程家族关 系、进程当前打开的文件
linux操作系统 华软软件学院电子系
P9
进程的基本状态
►运行态(Running)
n 进程占有CPU,并在CPU上运行。在单CPU系统中, 最多只有一个进程处于运行态。
►就绪态(Ready)
n 一个进程已经具备运行条件,但由于无CPU暂时 不能运行的状态(当调度给其CPU时,立即可以 运行)。处于就绪状态的进程可以有多个。队列 的排列次序一般按优先级大小来排列。
linux操作系统 华软软件学院电子系
P25
进程的创建
► 进程创建的时机
n n n n 用户登彔 作业调度 提供服务 应用请求
► 进程创建的过程
n 取得一个空白PCB,生成一个唯一的进程标识 号(一般是数字形式) n 为新进程分配必要的资源 n 初始化PCB将新进程的PCB揑入就绪队列
linux操作系统 ux的进程状态转换模型
linux操作系统
华软软件学院电子系
P20
Linux中与进程相关的命令
PS
ps —— Processes Snapshot 句法:ps [OPTIONS]
功能:对系统中的进程进行监控
[OPTION]参数如下:
l:长格式输出 u:按用户名和启动时间顺序来显示进程 j:用任务格式来显示进程 f:用全格式来显示进程 a:显示所有用户的所有进程 x:显示无控制终端的进程
►进程与程序的关联
n 进程是程序的一次执行过程,即一个执行实例 n 程序与进程存在:1:1、1:n的关系 n 进程与程序存在:1:1、1:n的关系
►进程与程序的区别
n 程序:静态、指令集合、无生命周期、可保存、不是进 程调度和分配资源的单位 n 进程:动态、执行过程、有生命周期、不可保存、是进 程调度和分配资源的单位 n 进程是由程序、数据和进程控制块三部分组成;进程具 有创建其他进程的功能,而程序没有。
linux操作系统 华软软件学院电子系
P22
Linux中与进程相关的命令
kill
关闭进程:kill 进程号 kill -9 进程号(强行关闭) kill -1 进程号(重启进程) 结束所有进程:killall 查找服务进程号:pgrep 服务名称 关闭进程:pkill 进程名称
linux操作系统
华软软件学院电子系
唤醒
低优睡眠
高优睡眠
linux操作系统
华软软件学院电子系
P12
进程的组成
►操作系统控制结构
n n n n 内存表用来跟踪主存和辅存。 I/0表用来管理I/0设备和通道。 文件表提供当前存在文件中的信息。 进程表用来管理进程。
►进程的组成
n 程序段:进程所对应的可执行程序; n 数据段:程序运行过程中要用到的数据或工作区; n 进程控制块(PCB):为管理进程设置的一个专门的数 据结构,用于记彔进程的外部特征,描述进程的运动变 化过程。
华软软件学院电子系
P18
linux操作系统
Linux PCB中的进程状态(state)
n 暂停状态
u u
u
进程暂时停止运行以接受某种特殊处理 通常当进程接收到SIGSTOP、SIGTSTP、SIGTTIN 或 SIGTTOU信号后就处于这种状态(关于信号,将 在以后讲述) 例如,正接受调试的进程就处于这种状态
P17
linux操作系统
Linux PCB中的进程状态(state)
n 可运行状态
u u u
进程正在运行(运行态)、或者正准备运行(就绪态) 正在运行的进程就是当前进程 准备运行的进程只要得到CPU就可以立即投入运行, CPU是这些进程唯一等待的系统资源