精华内容
下载资源
问答
  • 一个程序能有几个进程
    千次阅读
    2019-12-16 21:55:42

    一个程序几个进程在于这个程序的开发者的设置,可以是1个,也可以是多个的。

    1.一个程序里有很多个进程

    一个程序几个进程在于这个程序的开发者的设置,可以是1个,也可以是多个的。一个应用程序,启动多个处理进程。换言之,所有进程隶属于当前应用程序;这是所谓的多进程服务。

    2.一个程序只有一个进程但被开启很多个

    启动多个同一应用程序,每个应用程序都是单进程。这个场景有些应用程序会禁用掉,有些是可以的,看应用程序的定位。如果允许,那么需要解决数据共享的问题(主要是数据写入);如果不允许,那么只能启动一个此类应用程序。

    对于现代操作系统(OS)以上两种场景时刻都在发生。比如QQ,允许同时登陆多个账号而出现多个qq程序。同时每个qq程序又有多个进程进行业务处理。

    更多相关内容
  • Android App进程中最少有几个线程

    千次阅读 2019-03-26 14:48:03
    当应用程序组件启动,且应用程序没有其他组件运行时,Android系统为这个应用程序启动一个新的Linux进程,并开始运行一个主线程。默认情况下,同一应用程序的所有组件都在同一进程的主线程中运行。如果应用程序组件...

    当应用程序组件启动,且应用程序没有其他组件运行时,Android系统为这个应用程序启动一个新的Linux进程,并开始运行一个主线程。默认情况下,同一应用程序的所有组件都在同一进程的主线程中运行。如果应用程序组件启动,并且已经存在该应用程序的进程(因为应用程序中的其它组件已经启动),则组件将在该进程中启动,并使用相同的主线程。但是,您可以通过设置让应用程序中的不同组件分别在不同的进程中运行,并且可以为任何进程创建其它线程。本文档讨论了进程和线程是如何在Android应用程序中工作的。
    Processes

    默认情况下,同一应用程序的所有组件都运行在同一进程中,大多数应用程序不需要改变此设置。但是,如果您需要设置某个组件到特定进程,则可以在manifest文件中来实现。

    每种组件元素(activity、service、receiver和 provider)都支持android:process属性,用于指定该组件运行在哪个进程中。您可以设置此属性,使每个组件在自己的进程中运行,或者某些组件共享进程,而其他组件不共享进程。您还可以设置android:process,以便不同应用程序的组件在同一进程中运行,前提是应用程序共享相同的Linuxuser ID,并使用相同的证书进行签名。元素也支持android:process属性,用于设置适用于所有组件的默认值。

    当内存不足时,Android系统可能会在某个时刻kill进程,以保证其他更直接为用户服务的进程能正常运行。在被kill的进程中运行的应用程序组件因此被销毁。当组件再次工作时,将再次启动新的进程。

    Android系统会权衡进程相对于用户的重要性来决定要杀死哪些进程。例如,与屏幕上可见Activity的进程相比,它更容易关闭在屏幕上不再可见的Activity的进程。因此,是否终止进程取决于运行在该进程中的组件的状态。更多关于进程生命周期与APP状态关系的讲解,请见Processes and Application Lifecycle。
    线程

    当应用程序启动时,系统为应用程序创建主线程。此线程非常重要,因为它负责将事件分派到的widgets。应用程序与UI组件交换也主要在主线程中进行,所以主线程也叫UI线程。然而,在特殊情况下,应用程序的主线程可能不是它的UI线程;有关更多信息,请参见 Thread annotations。

    系统不为组件的每个实例创建单独的线程。运行在同一进程中的所有组件都在该进程的UI线程中实例化,系统从UI线程发出对每个组件的调用。因此,响应系统的回调函数(如onkeydown()或onCreate())始终运行在进程的UI线程。例如,当用户触摸屏幕上的某个按钮时,应用程序的UI线程将触摸事件分发给UI控件,后者依次设置其按下状态,并向事件队列发送无效请求。UI线程取出请求并通知UI控件重新绘制。

    如果在UI线程中做所有事情,那么执行诸如网络访问或数据库查询之类的耗时操作将阻塞整个UI。当线程被阻塞时,就不能发送任何事件,包括绘制事件。从用户的角度来看,应用程序就会出现卡顿。更糟糕的是,如果UI线程被阻塞超过几秒钟(现在大约是5秒),系统就会向用户弹出“应用程序没有响应”(ANR)的对话框。然后,用户可能会退出应用程序,甚至卸载它。

    另外,安卓UI toolkit不是线程安全的。因此,您不能从工作线程操作您的UI,您必须从UI线程对用户界面进行操作。因此,Android的单线程模型有两条规则:
    1、不要阻塞UI线程
    2、不要在非UI线程中操作UI控件。
    工作线程

    由于上面描述的单线程模型,不阻塞UI线程对应用程序的响应性至关重要。如果要执行的操作不是瞬时的,则应该确保在单独的线程(“后台线程”或“工作线程”)中执行它们。但是,请注意,您不能从UI线程或“主线程”以外的任何线程更新UI。为了解决这个问题,Android提供了下面几种从其他线程访问UI线程的方法:

    Activity.runOnUiThread(Runnable)
    View.post(Runnable)
    View.postDelayed(Runnable, long)
    
    public void onClick(View v) {
        new Thread(new Runnable() {
            public void run() {
                // a potentially  time consuming task
                final Bitmap bitmap =
                        processBitMap("image.png");
                mImageView.post(new Runnable() {
                    public void run() {
                        mImageView.setImageBitmap(bitmap);
                    }
                });
            }
        }).start();
    }
    

    这个实现是线程安全的:后台操作在一个单独的线程中,而ImageView总是操纵UI线程。

    然而,随着操作复杂度的增加,这种代码会变得复杂和难以维护。为了处理UI线程与工作线程更复杂的交互,您可以考虑在工作线程中使用Handler来处理从UI线程传递的消息。或者用AsyncTask,实现后台工作任务,且更新UI。
    使用AsyncTask

    AsyncTask允许你在用户界面上执行异步操作。它在工作线程中执行耗时操作,然后更新UI,而不需要您自己处理线程或Handler。你必须扩展AsyncTask并且实现doInBackground()回调方法,它启动的线程会运行在后台线程池。如果要更新UI,你应该实现onPostExecute()。它会获取从doInBackground()返回的结果,并在UI线程中更新UI。然后可以在UI线程中调用execute()运行任务。更多关于AsyncTask的资料请参考 AsyncTask。
    线程安全的方法

    在某些情况下,您实现的方法可能会从多个线程调用,因此必须编写为线程安全的。有些方法是可以远程调用的,如bound service中的方法。当在IBinder运行的进程中调用IBinder实现的方法,那么方法是在调用者的线程中执行。但是,当在其它进程中调用IBinder实现的方法,那么方法运行所在的线程是由系统维护的一个线程池创建,并且与IBinder在同一进程。例如,Service的onBind()方法是从Service的UI线程调用的,onBind()返回的对象中的方法是在是从线程池创建的线程调用的。因为服务可以有多个客户端,多个线程可以同时使用同一个IBinder方法,因此IBinder方法必须被实现为线程安全的。

    类似地,content provider可以接收来自其他进程的数据请求。虽然ContentResolver和ContentProvider类隐藏了他们是怎样管理进程间通信的,ContentProvider中的query(), insert(), delete(), update(), 和getType()等方法是从content provider所在进程的线程池调用的。因为这些方法可以同时从任意数量的线程中调用,所以它们也必须实现为线程安全的。
    进程间通信

    Android使用远程过程调用(RPC)提供了一种进程间通信机制(IPC),Activity或其它应用程序组件调用方法,但是在另一个进程中执行,执行完后返回结果给调用者。这就需要分解方法和数据,使操作系统能理解,并将它从本地进程和地址空间传递到远程进程和地址空间,然后重新组装和调用。返回值然后以相反的方向传输。Android提供了实现IPC的所有代码,因此您可以将重点放在定义和实现RPC编程接口上。要执行IPC,你的应用必须使用bindService()绑定到一个服务,使用bindservice(),有关更多信息,请参见 Services开发指南。

    展开全文
  • 我们都知道Docker容器的哲学是一个Docker容器只运行一个进程,但是时候我们就是需要在一个Docker容器中运行多个进程 那么基本思路是在Dockerfile 的CMD 或者 ENTRYPOINT 运行一个”东西”,然后再让这个”东西”...

    我们都知道Docker容器的哲学是一个Docker容器只运行一个进程,但是有时候我们就是需要在一个Docker容器中运行多个进程

    那么基本思路是在Dockerfile 的CMD 或者 ENTRYPOINT 运行一个”东西”,然后再让这个”东西”运行多个其他进程
    简单说来是用Bash Shell脚本或者三方进程守护 (Monit,Skaware S6,Supervisor),其他没讲到的三方进程守护工具同理

    Bash Shell脚本

    入口文件运行一个Bash Shell 脚本, 然后在这个脚本内去拉起多个进程
    注意最后要增加一个死循环不要让这个脚本退出,否则拉起的进程也退出了
    run.sh

     

     

    在Dockerfile的入口中运行run.sh

     

    用Bash Shell 的方式,任意发行版的linux都支持,缺点是不能拉起crash的进程,也就是只能拉起运行不能”守护”
    如果不关心进程crash问题那么可以用这种方式

    三方容器进程初始化之-dumb-init

    dumb-init官方
    A minimal init system for Linux containers
    一个最小化的Linux容器初始化系统
    dumb-init是一个简单的进程监控器和init系统,设计为在最小容器环境(如Docker)中作为PID 1运行。它被部署为一个用C编写的小型静态链接二进制文件。
    Dockerfile 参考

     

    ServiceMesh的数据平面Envoy Proxy的容器镜像就是使用的dumb-init

    三方容器进程初始化之-tini

    tini官方
    A tiny but valid init for containers
    容器的一个小而有效的init

    三方进程守护之-Monit

    Monit和Supervisor还是有很大区别的,Supervisor管理的都是前台执行的进程,Monit既可以管理前台进程也可以管理后台进程,简单的说,在CentOS中使用service xxx start 启动的程序,使用Monit可以直接管理,这就解决了很多没有前台方式启动的程序不能用Supervisor来管理的问题。
    Dockerfile 参考

     

    三方进程守护之-Supervisor

    大名鼎鼎的 Supervisor
    如果有多种版本的linux要用那么可以用Supervisor做统一进程守护管理,网上资料一大堆
    注意要以前台程序运行,配置文件中要有,如果是后台的方式docker会退出

     

    Dockerfile 参考

     

     

    三方进程守护之-Skaware S6

    Supervisor是常见的进程守护程序,不过程序文件太大,想要容器镜像尽量小,在特别是用Alpine作为基础镜像的时候推荐使用Skaware S6
    参考这个微服务基础镜像 https://github.com/nicholasjackson/microservice-basebox 他就是用 Skaware 作为进程守护程序运行多个进程的
    如果基础容器镜像是本身就是Alpine,那就再合适不过了
    Dockerfile 参考

     

     

    cron.run example

     

     

    app.run example

     

     

    三方进程守护之-s6-overlay

    s6-overlay 是基于 Skaware S6适用于容器的进程守护工具
    s6-overlay 官网 https://github.com/just-containers/s6-overlay
    Dockerfile 参考

     

     

    三方进程守护之-runit

    runit官网http://smarden.org/runit/
    具体的使用方法见官网
    在Docker生态圈, phusion/baseimage-docker, gitlab 在使用runit作为进程管理工具

    下面以要运行cron 和 ssh 为例
    /etc/service/ 为配置文件目录

    /etc/service/sshd 为要运行的程序目录
    /etc/service/sshd/run 为需要运行的程序入口脚本文件
    cat run

     

     

    /etc/service/cron 为要运行的程序目录
    /etc/service/cron/run 为需要运行的程序入口脚本文件
    cat run

     

     

    Dockerfile 参考

     

     

    三方进程守护之-Systemd

    在 docker 中使用 Systemd 需要在 docker run 的时候开启特权模式 –privileged ,所以不推荐
    这个直接放弃了
    Dockerfile 参考

     

     

    参考资料

    Alpine里的go应用,你猜他能有多小? http://blog.csdn.net/sisiy2015/article/details/50350261
    如何运行多进程Docker容器? http://dockone.io/article/951
    在Docker Container中启动定时任务 http://dockone.io/article/1070
    Docker容器内多进程管理(一)-Supervisor http://www.linuxprobe.com/docker-process-management1.html
    Docker容器内多进程管理(二)-Monit http://www.linuxprobe.com/docker-process-management2.html
    关于S6和Runit的论坛讨论 S6 or Runit, not systemd https://www.linuxquestions.org/questions/slackware-14/s6-or-runit-not-systemd-4175465428/
    [译] runit 快速入门 https://segmentfault.com/a/1190000006644578

    转载于:https://www.cnblogs.com/sunsky303/p/11046681.html

    展开全文
  • 网络-一个进程是否拥有多个端口

    万次阅读 2019-03-05 09:26:36
    1.端口理解 其它网友的观点 ... 博文中打的比喻个人觉得很形象,特此引用一下。...其它网友也相同的问题,大部分人认为一个进程可以拥有多个端口。 端口 下面是引用别人博客的话,同样觉得挺形象。socke...

    感兴趣可以加QQ群85486140,大家一起交流相互学习下!

    1.端口理解

    • 其它网友的观点
      博文1:https://segmentfault.com/q/1010000015610487
      博文中打的比喻个人觉得很形象,特此引用一下。
      在这里插入图片描述
      博文2:https://bbs.csdn.net/topics/392270274?page=1
      其它网友也有相同的问题,大部分人认为一个进程可以拥有多个端口。

    • 端口
      下面是引用别人博客的话,同样觉得挺形象。socket对象通过IP地址+端口唯一确定。所以socket一端往发数据最终都会保存到接受端的端口处,很形象。

    端口其实就是队,操作系统为各个进程分配了不同的队,数据包按照目的端口被推入相应的队中,等待被进程取用,在极特殊的情况下,这个队也是有可能溢出的,不过操作系统允许各进程指定和调整自己的队的大小。

    2.编程验证

    实践证明一个进程可以拥有多个端口

    • 实现步骤
      进程中重新创建一个线程,并分别在主线程和新创建的线程中创建一个socket对象,并绑定不同的端口。然后服务端连接不同的服务。即可实现一个进程拥有多个端口通信的例子。具体例子代码可以从 这里下载
    //server端代码片段
            SOCKET sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (INVALID_SOCKET == sServer) {
                    WSACleanup();
                    return FALSE;
            }
            //3 准备通信地址  
            SOCKADDR_IN addrServer;
            addrServer.sin_family = AF_INET;
            addrServer.sin_port = htons(THREAD1_PORT); //这里主线程使用时另外一个端口号。
            addrServer.sin_addr.s_addr = INADDR_ANY;//任意可用地址  
            //4 绑定地址与socket(bind)  
            if (SOCKET_ERROR == bind(sServer, (const sockaddr*)&addrServer, sizeof(SOCKADDR_IN))) {
                    closesocket(sServer);
                    WSACleanup();
                    return FALSE;
            }
    
    • 运行效果:
      结果同预期一样。
      在这里插入图片描述
    展开全文
  • 一个CPU就可以同时运行多个进程

    千次阅读 2020-07-06 20:56:33
  • 一个进程最多可以创建多少个线程?

    万次阅读 多人点赞 2021-07-15 09:19:09
    大致意思就是,他看了一个面经,说虚拟内存是 2G 大小,然后他看了我的图解系统 PDF 里说虚拟内存是 4G,然后他就懵逼了。 其实他看这个面经很问题,没有说明是什么操作系统,以及是多少位操作系统。 因为不同的...
  • python多进程多线程,多个程序同时运行

    万次阅读 多人点赞 2021-04-08 13:47:15
    python 多线程 多进程同时运行 多任务要求 python 基础语法 python 文件目录操作 python 模块应用 开发工具 pycharm ...在段时间内交替执行多任务, 例如单核cpu 处理多任务, 操作系统让各个任务交
  • 百度知道的答案: 比如显示图像的驱动程序,多个程序的显示都是需要他来执行。 我们玩游戏算一个程序,需要显示图像的驱动,声音驱动...然后你在执行一个命令行,顺序调用这两个程序,就会实现一个剪切文件的功能...
  • 也知道线程的概念,它是程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程多个线程。 既然如此,我们可以想象,一个系统中的进程数量肯定是上限的,不然系统资源就会不够用了,同样的道理,一...
  • 并发:当多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于...
  • 连续3次fork产生几个进程

    千次阅读 2020-02-27 19:52:01
    次fork() #include<stdio.h> #include<unistd.h> int main() { fork(); printf("this is a process\n"); return 0; } 结果2 2次fork() #include<stdio.h> #include<u...
  • 进程程序的区别

    千次阅读 多人点赞 2020-08-23 11:59:38
    进程一个程序与其使用的数据在处理机上顺序执行时发生的活动。进程程序一个数据集合上的运行过程。它是系统进行资源分配和调度的一个独立单位。 2)进程的特征: 动态性:是程序的一次执行; 并发性:进程...
  • 线程:程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程多个线程。 既然如此,我们可以想象,一个系统中的进程数量肯定是上限的,不然系统资源就会不够用了,同样的道理,一个进程中的线程...
  • 程序进程,线程的区别和联系

    万次阅读 多人点赞 2018-08-26 22:27:18
    进程一个动态的实体,它自己的生命周期。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消。反映了一个程序在一定的数据集上运行的全部动态过程。 2)进程程序并不是一一...
  • 默认情况下linux环境下一个进程最多能有多少个线程?: 主线程+自己的线程382 = 383 这我自己已经验证过,测试程序在后面。
  • 个进程同时访问同一个文件

    万次阅读 2019-04-08 09:06:06
    对于多个进程打开同一文件的情况,每个进程它自己的文件表项(file对象),其中它自己的文件位移量,所以对于多个进程读同一文件都正确工作。但是,当多个进程写同一文件时,则可能产生预期不到的结果。...
  • 如何在linux中关闭一个进程

    万次阅读 2021-09-15 10:43:35
    后来知道,在linux中可以按ctrl+c来关闭一个程序。比如说在以下的程序中: 如果直接点击叉叉,就会出现该提示。 而按下ctrl+c后就可以直接退出来了。这个插入符号(^)代表 Ctrl。所以基本上,终端将 Ctrl+C 的...
  • 进程与线程的关系 简单复习一下:一个”进程“代表中计算机中实际跑起来的一个程序,在现代操作...因此一个进程至少得有一个线程,我们把这个线程称之为”主线程“,也就是说,一个进程至少要有一个主线程。 ......
  • 保持原样不变,但两个原本操作同一个表的,改为不同表,建立数据同步机制 背景 环境 Oracle 12c 数据 批量服务器N 应用服务器M 情景 同一时点服务器N要truncat数据,服务器M则要向表中插入数据 Oracle行级锁,...
  • Linux 查看进程几个命令

    万次阅读 多人点赞 2020-06-17 11:22:00
    查看进程状态的基础指令,以下几个常用参数: ps 查看当前终端下的命令 top 查看所有的进程(是动态的) 本文重点介绍通过ps命令查看进程 :一些常用的参数组合及解析 1. 查看包含其他使用者的进程,和PID,...
  • 端口号可以用来标识同一个主机上通信的不同应用程序,端口号+IP地址就可以组成一个套接字,用来标识一个进程 2.端口号的应用场景 在TCP/IP协议中,用“源IP地址”,“目的IP地址”,“源端口号”,“目的端口号”,...
  • linux之如何查看哪些进程在使用某一个so

    千次阅读 多人点赞 2019-03-23 23:48:53
    1问题 在我们服务端,我们怎么查看哪些进程在使用某一个so 2解决办法 lsof **.so 很明显,我们的apache的httpd几个进程在使用这个so
  • Linux C程序修改进程名称

    千次阅读 多人点赞 2021-05-12 22:13:26
    Linux C程序修改进程名称(通过修改argv[0])1、前言2、命令行参数(argc, argv)以及环境变量(environ)介绍2.1、C程序典型的存储空间布局2.2、argc, argv介绍2.3、environ介绍2.4、编写程序验证修改进程名是否可以...
  • 那么当一个手机遇到卡顿的问题时,真的就无可救药了吗?不,你还可以,通过调整手机【开发者选项】中的设置,来拯救一下你的手机。下面我们就一起来看一下吧。1. 后台进程设置手机卡顿的原因就是后台运行空间不足,...
  • 程序进程的区别是什么?

    千次阅读 2021-06-30 16:02:54
    程序是静态的,进程是动态的:程序是存储在某种介质上的二进制代码,进程对应了程序的执行过程,系统不需要为一个不执行的程序创建进程,一旦进程被创建,就处于不断变化的动态过程中,对应了一个不断变化的上下文...
  • 一个程序个进程

    千次阅读 2011-04-08 18:20:00
     说白了就是,一个程序可以重复运行,开几个窗口,比如网游的“双开”,一个进程可以对应多个程序就是一个DLL文件可一被多个程序运用,比如DirectX9的动态链接库,就是,许多游戏都要它才能运行。
  • 程序进程的关系

    千次阅读 2019-09-10 16:51:54
    进程是程序一个执行周期,是正在执行的程序,是程序的执行实体 主要区别 (1)程序是永存的;进程是暂时的,是程序在...(5)进程和程序不是一一对应的: 一个程序可对应多个进程即多个进程可执行同一程序; ...
  • 手机运行后台标准进程限制是几个,最多是四个吗,手机运行后台标准进程限制是几个,最多是四个吗,小米8手机,6G运行内存标准就是无限制,只在必要时关闭后台程序,建议选择“不得超过4个进程”限制太少的话会关闭...
  • 进程间通信种方式?

    万次阅读 2019-04-28 16:01:55
    高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系...
  • 什么是程序,进程和线程?三者之间何关系?

    万次阅读 多人点赞 2017-05-10 19:44:11
    进程进程与线程的历史我们都知道计算机是由硬件和软件组成的。... 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 833,358
精华内容 333,343
关键字:

一个程序能有几个进程