线程(一)

例1:从fork()看线程
fork()创建新进程的系统调用。定义一个变量Pid,存储进程号,然后做fork操作,子进程就产生了,继承了父进程的所有资源,代码,堆栈,打开文件等等。如果是父进程,fork返回了子进程的pid,如果是子进程,fork返回0,可以用这个返回值区分父子进程。

int main(){
    int pid = 0;
    
    printf("the parent is going to fork\n")
    if(pid = fork() != 0){
        printf("I am the father of %d\n", pid);
    }  else{
        printf("I am the child\n");
    }
}

这个例子,可以看到程序是静态的,但是进程执行代码过程中的轨迹是动态的,父子进程就有不同的结果,有跳转有判断。这样的动态跳转就给操作系统带来了麻烦。跳转判断的过程留下了线索,怎么样去准确的反映这个线索?这就是提出线程概念的意图之一。

PS:老师提的这个例子其实我没有看懂。。进程PCB里面不是有program counter?难道进程不能跟踪线索?这个问题先留着。

例2:单线程VS多线程
假设单线程模式,一个选课系统,1000个学生区分这些人那就要有1000个进程,这些进程的代码几乎是一样的,进程创建很消耗时间,那个数据结构也很大,那就要1000个PCB,有人问难道不能共享代码和数据?好,有可能共享一部分代码和数据,或许用不来那么多的空间。那调度时候Context Switch频繁切换,会有很大很大的开销,这有多难多恶心。。可想而知。

这也是提出线程概念的另一个意图。

定义来了!
在一个任务下面包含了若干个线程,这若干个线程共享了一个大任务的一些资源(代码、数据、文件等),每个线程有独立的资源(寄存器、栈、程序计数器等)。(是有层次的,一定要强调一个任务下面)

线程可以解决例子中的两个问题:

  • 每个线程都有自己的Program counter,所以可以跟踪不同线程的轨迹。
  • 另外线程还能共享那些公共资源,没有太多空间消耗。线程切换也不存在Context Switch的问题。

除了上面的两点,还有下面的优点:

  • 对多处理器或者多核(算数逻辑单元独立,共享了cache)系统,可以让每一个核去对应执行一个线程,而单线程进程只能运行在一个CPU(核)上,多线程在多CPU或多核系统中加强了并发功能。
  • 响应度高,多线程即使部分阻塞或者执行较冗长的操作,该程序仍然能继续执行。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 首先了解单线程:一、单线程的应用,整个应用中只有一个顺序执行流,当执行流在执行某个耗时的操作,或者不能立即完成的任...
    甘哲157阅读 725评论 1 8
  • 多线程技术是个很庞大的课题,《Java编程思想》这本书(英文版,以下简称TIJ)中也用了136页介绍Java的多线...
    码头军阅读 1,514评论 0 0
  • 线程概述 线程与进程 进程  每个运行中的任务(通常是程序)就是一个进程。当一个程序进入内存运行时,即变成了一个进...
    闽越布衣阅读 1,114评论 1 7
  • 造物法则:给出去什么,就收到什么,给出去多少,就会收到多少。 要想锚定爱、喜悦、和平,就必须给出去爱、喜悦、和平。...
    零贰O2阅读 213评论 0 0
  • 回想起来自己离开家已经快1年了,那是我兴奋我能出去这个待了10几年的家乡,当家人开车送我的时候,我莫名其妙的流泪了...
    一场美梦被惊醒阅读 542评论 0 2

友情链接更多精彩内容