Java-进程


前言

        由于CPU进入了多核心时代,这就要求了程序员如果要充分发挥出CPU的运算效率,就必须采用并发编程,进程这个概念也就被引入了。


提示:以下是本篇文章正文内容,下面案例可供参考

一、进程是什么

        进程是程序依次动态执行的过程,它对应了从代码加载、执行到执行完毕的过程.这个过程也是进程本身从产生、发展到消亡的过程。一个进程可分为两个部分,分别为要执行的指令和执行指令时所需的各种系统资源,如CPU、内存等。

        进程是包含线程的. 每个进程至少有一个线程存在,即主线程。进程中的每个线程执行不同的任务,这样就达到了多任务处理的目的。


特点

        进程消耗资源(创建、销毁、调度)多,速度慢。

        在操作系统内部,进程是操作系统进行资源分配的基本单位。


        进程是操作系统对一个正在运行的程序的一种抽象,可以看作是一种资源,并且是由操作系统内核负责管理(描述+组织)的。

PCB-描述

由于操作系统一般由C/C++编写,所以使用了C语言的结构体来描述进程,那么这个结构体就称为了PCB(Process Control Block)。

        PCB包括:pid 进程的身份标识符。内存指针 指向所在内存。文件描述符表 硬盘上的文件等资源。

组织

可以简单认为是通过双向链表将多个PCB串连在一起。 

二、进程调度的特性

进程状态

就绪状态:随时都能到CPU上执行。

运行状态:正在CPU上执行。

阻塞状态:在这一段时间内,无法到CPU上执行。

优先级

进程有优先级,操作系统调度进程也是按照优先级顺序来进行工作的。

上下文-读档 存档

操作系统在进行进程切换的时候,会把进程执行的中间状态记录,当下次再次调用到这个进程的时候,会恢复到上次的状态。保存上下文,是此时CPU寄存器的值,保持到内存中(PCB)。回复上下文,是把内存中的值读出,写回寄存器。

记账信息

操作系统统计每一个进程在CPU上占用的时间和执行的指令数目,据此来判断下一阶段的调度。

那么,以上就是本文的全部内容了。

### Java -jar 启动的进程是否为守护进程 Java `-jar` 命令本身并不会自动将启动的进程设置为守护进程。当使用 `java -jar` 启动一个 JAR 文件时,该进程会作为一个普通的前台进程运行[^1]。这意味着除非采取额外措施将其作为后台任务执行,否则它会在终端关闭时终止。 为了使 `java -jar` 启动的进程成为守护进程,通常可以采用以下方法: #### 方法一:使用 nohup 命令 可以通过 `nohup` 命令来忽略挂起信号(SIGHUP),从而让进程在用户退出登录后继续运行。这种方式简单易用,适合快速部署场景。 ```bash nohup java -jar your-application.jar >> app.log 2>&1 & ``` 此命令将标准输出和错误重定向至 `app.log` 文件,并以后台模式运行[^5]。 #### 方法二:编写 Shell 脚本管理守护进程 更复杂的场景下,可以创建一个 Bash 或其他脚本来定义如何启动、停止以及监控服务状态。例如,在 Linux 中可参照如下模板: ```bash #!/bin/bash WORK_DIR="/path/to/your/app" LOG_FILE="$WORK_DIR/application.log" PID_FILE="$WORK_DIR/application.pid" is_running() { if [ -f "$PID_FILE" ]; then local pid=$(cat "$PID_FILE") if ps -p $pid > /dev/null; then return 0 fi fi return 1 } start_app() { if ! is_running; then cd "$WORK_DIR" nohup java -jar your-application.jar >> "$LOG_FILE" 2>&1 & echo $! > "$PID_FILE" echo "Application started with PID $(cat $PID_FILE)" else echo "Application already running." fi } stop_app() { if is_running; then kill "$(cat $PID_FILE)" && rm "$PID_FILE" echo "Application stopped." else echo "Application not running." fi } case "$1" in start) start_app ;; stop) stop_app ;; restart) stop_app start_app ;; *) echo "Usage: $0 {start|stop|restart}" ;; esac ``` 这种方法提供了更好的控制能力,允许通过简单的命令操作应用的状态[^3]。 #### 方法三:利用操作系统级别的服务管理器 对于现代 Linux 发行版而言,推荐使用 systemd 来注册并维护长期运行的服务。这不仅能够确保程序始终处于活动状态,还能提供诸如日志轮转等功能支持。 总结来说,单纯依靠 `java -jar` 并不会形成守护进程形式的工作流,需借助外部手段达成目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

todd1er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值