赞
踩
进程:有独立的 进程地址空间。有独立的pcb。 分配资源的最小单位。
线程:有独立的pcb。没有独立的进程地址空间。 最小单位的执行。
Linux平台下的情况是,线程只不过是进程的一种特殊形式,sleep只影响当前线程。
多线程 中经常会使用sleep()函数,我们知道cpu对于多线程的操作是采用时间片轮询的方式,即,时间片1操作线程A,时间片1结束后,时间片2操作线程B,时间片2结束后,时间片3操作线程A,依次交替执行。
参考:《Linux 内核源代码情景分析》
对于进程来说,相同的地址(同一个虚拟地址)在不同的进程中,反复使用而不冲突。原因是他们虽虚拟址一样,但,页目录、页表、物理页面各不相同。相同的虚拟址,映射到不同的物理页面内存单元,最终访问不同的物理页面。但!线程不同!两个线程具有各自独立的 PCB,但共享同一个页目录,也就共享同一个页表和物理页面。所以两个 PCB 共享一个地址空间。实际上,无论是创建进程的 fork,还是创建线程的 pthread_create,底层实现都是调用同一个内核函数clone。
如果复制对方的地址空间,那么就产出一个“进程”;如果共享对方的地址空间,就产生一个“线程”。因此:Linux 内核是不区分进程和线程的。只在用户层面上进行区分。所以,线程所有操作函数pthread_* 是库函数,而非系统调用。
- #include <unistd.h>
-
- unsigned int sleep (unsigned int seconds);
参数:线程挂起秒数
返回值:进程/线程挂起到参数所指定的时间则返回0,若有信号中断则返回剩余秒数
sleep函数的作用是:线程告诉操作系统,在second秒的时间内,自身不需要调度(直接睡觉了),不要给自身分配时间片了。
使cpu更容易易主(因为放弃时间片了,所以就易主了)
- int main()
- {
- while(1)
- {
- //do sth.
- sleep(1);
- //do sth.
- }
- return 0;
- }
while(1)死循环,一直在占用CPU,使其他进程得不到cpu资源,使用sleep,使该线程挂起,为其他进程让路。在程序没有时效性或者在程序运行时间允许的范围内添加合适秒数------sleep(seconds).
- #include<unistd.h>
- #include<pthread.h>
- void *myFunc(void *p){
- int i=0;
- for(i;i<2;i++){
- printf("myFunc i=%d\n",i);
- }
- printf("son thread...\n");
- return NULL;
- }
- int main(){
- pthread_t thread;
- if(pthread_create(&thread,NULL,myFunc,NULL))
- perror("pthread_create fail");
- return -1;
- }
- printf("main thread...\n");
- return 0;
- }
主线程中,没有使用sleep()函数,则主线程直接输出main thread...便退出了,并没有时间去执行子线程(主线程的时间片内执行到return 0 了,已经进程直接结束,都没有来得及执行子线程的时间片(虽然子线程已经处于就绪态了))
这种情况下,程序一开始一直处于主线程的时间片内。
- #include<unistd.h>
- #include<pthread.h>
- void *myFunc(void *p){
- int i=0;
- for(i;i<2;i++){
- printf("myFunc i=%d\n",i);
- }
- printf("son thread...\n");
- return NULL;
- }
- int main(){
- pthread_t thread;
- if(pthread_create(&thread,NULL,myFunc,NULL))
- perror("pthread_create fail");
- return -1;
- }
-
- sleep(1);//添加sleep//此处使用phread_join()函数也可以
-
- printf("main thread...\n");
- return 0;
- }
如上所示,主线程中添加了sleep函数,
执行结果
myFunc i=0
myFunc i=1
son thread...
main thread...
sleep(1);主线程挂起了1s,放弃了时间片剩余部分,cpu便去执行子线程了,1s钟后主线程处于就绪态,在子线程时间片结束后,cpu开始继续执行主线程。
个人理解:使用了sleep的同时,线程在second秒时间内处于挂起状态,同时也意味着,放弃了线程当前时间片中剩余的部分,也就是说程序执行到sleep语句后,cpu会立刻转向调度别的线程了。
原文链接:https://blog.csdn.net/modi000/article/details/104669668
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。