对于windows来说,进程和线程的概念都是有着明确定义的,进程的概念对应于一个程序的运行实例(instance),而线程则是程序代码执行的最小单元。CreateThread()用于建立一个新的线程,传递线程函数的入口地址和调用参数给新建的线程,然后新线程就开始执行了。
windows下,一个典型的线程拥有自己的堆栈、寄存器(包括程序计数器PC,用于指向下一条应该执行的指令在内存中的位置),而代码段、数据段、打开文件这些进程级资源是同一进程内多个线程所共享的。因此同一进程的不同线程可以很方便的通过全局变量(数据段)进行通信,大家都可以对数据段进行读写,这很方便,也被在安全性方面诟病,因为它要求程序员时刻意识到这些数据不是线程独立的。
对于linux来说,则没有很明确的进程、线程概念。首先linux只有进程而没有线程,然而它的进程又可以表现得像windows下的线程。linux利用fork()和exec函数族来 *** 作多进程。fork()函数可以在进程执行的任何阶段被调用,一旦调用,当前进程就被分叉成两个进程——父进程和子进程,两者拥有相同的代码段和暂时相同的数据段(虽然暂时相同,但从分叉开的时刻就是逻辑上的两个数据段了,之所以说是逻辑上的,是因为这里是“写时复制”机制,也就是,除非万不得已有一个进程对数据段进行了写 *** 作,否则系统不去复制数据段,这样达到了负担最小),两者的区别在于fork()函数返回值,对于子进程来说返回为0,对于父进程来说返回的是子进程id,因此可以通过if(fork()==0)…else…来让父子进程执行不同的代码段,从而实现“分叉”。
而linux下的进程不能像windows下线程那样方便地通信,因为他们没有共享数据段、地址空间等。它们之间的通信是通过所谓IPC(InterProcess Communication)来进行的。具体有管道(无名管道用于父子进程间通信,命名管道可以用于任意两个进程间的通信)、共享内存(一个进程向系统申请一块可以被共享的内存,其它进程通过标识符取得这块内存,并将其连接到自己的地址空间中,效果上类似于windows下的多线程间的共享数据段),信号量,套接字。
你先想清楚是否真的需要fork, signal, priority等pcntl的特性,如果其实你只是想要另外新开一个进程,也可以通过cli下面用exec执行额外的php进程来一定程度上模拟多进程
如果你确实需要fork等特性:
1cygwin是Windows上的POSIX环境,你可以在上边试试编译php以及pcntl的扩展(不知道是否能走通)
2上虚拟机吧
臆想个办法,不知道好不好实现:
1、胡乱写:
仅定义同步状态字,比如内存映射文件的第一个字节标识是否A进程正在写(值为1)、是否B进程正在写(值为2)、或者都没有在写(值为0)。
A进程中,当需要写时,首先读取第一个字节,如果发现第一个字节为0,则改变为1,然后写。B进程写处理与A进程类似。
2、分段写:
A进程需要写一个区段,B进程需要写另一个区段。如果划分合理,区段不重合,那么就可以不用考虑脏数据了。
总之,个人感觉既想同时A、B进程对同一位置写,又不想存有脏数据,感觉挺难的。
有机会了试一试,同时也期待更好的答案浮现。
windows是一个多任务 *** 作系统这是指Windows可同时运行多个应用程序。
多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务Linux、windows就是支持多任务的 *** 作系统,比起单任务系统它的功能增强了许多。
当多任务 *** 作系统使用某种任务调度策略允许两个或更多进程并发共享一个处理器时,事实上处理器在某一时刻只会给一件任务提供服务。
因为任务调度机制保证不同任务之间的切换速度十分迅速,因此给人多个任务同时运行的错觉。多任务系统中有3个功能单位:任务、进程和线程。
以上就是关于在windows中的进程、线程和在linux中的进程、线程有什么区别全部的内容,包括:在windows中的进程、线程和在linux中的进程、线程有什么区别、有办法在windows下实现PHP的多进程编程吗、windows编程多进程同步的问题如果我用内存映射文件来控制多进程的同步,该如何实现呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)