翻译: Context Switch Definition - 上下文切换

    上下文切换(进程切换/Task切换)是指CPU从一个进程或线程切换到另一个。

    进程(Task)是一个正在运行着的程序。在Linux中,线程是可以并行运行并与主进程共享内存空间和其他资源的轻量级进程。

    上下文(context)是指在任意时刻CPU寄存器和程序计数器的内容。寄存器是CPU内部的速度非常快的内存单元,它通过提供对计算过程中的常用值的极速访问来提高计算速度。程序计数器是一个指向CPU指令位置的特殊寄存器,这个位置要么是指向需要执行的指令地址要么指向下一条需要执行指令的地址,取决于系统。

    上下文切换可以被描述为:系统内核在CPU上执行关于进程/线程的以下操作:(1)停止当前进程,并把它的相关状态信息存到内存的某个地方。(2)从内存里拿出下一个进程的状态信息并放入寄存器里。(3)从程序计数器里取出这个进程需要运行的指令,开始继续执行这个进程。

Context Switches and Mode Switches

进程切换只会发生在内核模式下。内核模式是CPU的特权模式,在这个模式下只有内核可以运行并且可以访问所有内存位置和其他系统资源。其他的程序只能运行在用户模式下,但是他们可以通过系统调用(system call)来运行内核模式中的一部分功能。系统调用是类Unix系统中正在运行进程对内核提供的服务的一个请求,比如IO或创建新进程。IO可以被认为是(CPU与主内存结合体)的任意数据转移,包括移入和移出。也就是说这个结合体与用户(如键盘输入),存储(磁盘),或其他电脑的数据转移。

    类Unix系统里的这两种模式意味着当系统调用导致CPU需要变为内核态时一个类似又简单的操作(切换)是必须的。这是模式切换而不是上下文切换,因为它没有去运行其他进程。

    上下文切换是多任务操作系统的必备属性。多任务操作系统是指多个进程执行在单个CPU上看起来像是同时运行并且不互相妨碍。这种假象是通过快速的上下文切换来完成的(每秒上千次)。

    硬件中断也会引发上下文切换,硬件中断是指硬件设备产生发出一个信号给内核,告诉内核发生了一个事件(比如键盘输入,鼠标点击,网络数据到达,系统时钟)。

    Intel80386和更高级的CPU提供了对上下文切换的硬件支持。然而大多数现代的操作系统更趋向于使用软件上下文切换,它可以在任何CPU上使用,而不使用硬件上下文切换,用于提高性能。软件上下文切换最先是在Linux2.4版本内核中实现的,用于适配Intel-compatible系列CPU。

    软件上下文切换的一个主要好处是,硬件设备保存了几乎所有的CPU状态信息,而软件可以更有选择性,只保存真正需要保存和重新加载的部分。然而问题是这种做法对提升上下文切换效率到底有多重要?它的倡议者还声称软件上下文切换提供了改进切换代码可能,从而提高效率,它可以对已经加载的数据进行更好的控制。


The Cost of Context Switching

    上下文切换通常是加强计算的。就是说,它需要考虑处理器的时间,对每秒上千次的切换这个时间需要精确到纳秒。因此上下文切换会对系统CPU时间产生大量开销,并且可能成为系统里最大的开销。

    所以操作系统在设计时一个主要的点是怎么避免不需要的上下文切换。然而这是实践中是很难实现的。实际上,尽管上下文切换对CPU时间的开销已经下降了,单它主要通过提高CPU时钟速度而不是提高上下文切换本身。

    相比其他操作系统包括类Unix系统,Linux上下文切换和内核模式切换代价非常小。


转载于:https://www.cnblogs.com/superzhao/p/5147576.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我想将frontend 也是用volumes,将其映射到/app/frontend目录,在/app/frontend下install以及build,如何实现 docker-compose.yml文件: version: '3' services: frontend: build: context: ./frontend dockerfile: Dockerfile ports: - 8010:80 restart: always backend: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: python manage.py runserver 0.0.0.0:8000 ports: - 8011:8000 restart: always celery-worker: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server worker -l info --pool=solo --concurrency=1 depends_on: - redis - backend restart: always celery-beat: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler depends_on: - redis - backend restart: always redis: image: redis:latest ports: - 6379:6379 restart: always mysql: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=sacfxSql258147@ ports: - 8016:3306 volumes: - ./mysql:/var/lib/mysql restart: always frontend:dockerfile文件 FROM node:16.18.1 WORKDIR /app/frontend COPY package*.json ./ RUN npm install COPY . . RUN npm run build:prod FROM nginx:latest COPY --from=0 /app/frontend/dist/ /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
07-14
要将前端的代码映射到容器内的`/app/frontend`目录,并在容器内进行安装和构建,可以通过在`docker-compose.yml`文件中为`frontend`服务添加一个卷来实现。更新后的`docker-compose.yml`文件如下所示: ```yaml version: '3' services: frontend: build: context: ./frontend dockerfile: Dockerfile ports: - 8010:80 volumes: - ./frontend:/app/frontend restart: always backend: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: python manage.py runserver 0.0.0.0:8000 ports: - 8011:8000 restart: always celery-worker: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server worker -l info --pool=solo --concurrency=1 depends_on: - redis - backend restart: always celery-beat: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler depends_on: - redis - backend restart: always redis: image: redis:latest ports: - 6379:6379 restart: always mysql: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=sacfxSql258147@ ports: - 8016:3306 volumes: - ./mysql:/var/lib/mysql restart: always ``` 这样,将会把本地的`./frontend`目录映射到容器内的`/app/frontend`目录。然后,在容器内部构建过程中,使用`/app/frontend`目录中的代码进行安装和构建。 请注意,这里假设`docker-compose.yml`文件和`frontend`目录在同一级目录下。如果不是,请相应调整`volumes`中的路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值